# test/populate_test_data2.py
import sys
import os
from datetime import datetime, timedelta
import json
from app import create_app, db
from models.models import RawNews, ProcessedNews
from celery_worker import process_news_task


# 设置标准输出编码为UTF-8
if hasattr(sys.stdout, 'reconfigure'):
    sys.stdout.reconfigure(encoding='utf-8')
else:
    import io
    sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

# 添加项目根目录到Python路径
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

def populate_and_test_processing():
    """填充测试数据并测试处理功能"""
    app = create_app()

    with app.app_context():
        # 清空现有数据
        ProcessedNews.query.delete()
        RawNews.query.delete()
        db.session.commit()

        # 添加测试的原始新闻
        raw_news_list = [
            RawNews(
                title="小鹏汽车加速欧洲市场布局，开启海外本地化生产新篇章",
                content='小鹏汽车正式官宣欧洲本地化生产的重要规划，与位于奥地利格拉茨的麦格纳工厂展开深度合作，借助该工厂现有的成熟生产线，大力推动电动汽车在欧洲的本地化生产进程。',
                source="整车OEM",
                url="https://ne-time.cn/web/article/36688",
                publish_date=datetime.utcnow(),
                processed=False
            ),
            RawNews(
                title="小米第四款新车曝光：全新增程SUV！2026年见",
                content="从小米SU7一炮打响，到YU7蓄势待发，小米造车这盘棋，走得越来越稳了。而就在大家还在热议SU7销量、YU7谍照的时候，小米的第四款新车——代号“昆仑”的全新增程SUV，已经悄悄浮出水面，预计2026年正式上市。这回，小米要玩把大的：方盒子造型、三排座椅、增程动力、激光雷达全上阵，直接剑指理想L9、问界M9这些“奶爸神车”，野心昭然若揭。1 方正造型+三排大空间，这回主打一个“实用至上",
                source="整车OEM",
                url="http://mp.weixin.qq.com/s?__biz=MzU4MDY1Mzk2Nw==&mid=2247698806&idx=1&sn=e3c4acbec1d9df7ebebf1094057efe61&chksm=fd5e0f96ca298680d77528966f9804f8b9b1e259d65a3b2868210c06f650d2947b3ae3ea8e4a#rd",
                publish_date=datetime.utcnow() - timedelta(hours=2),
                processed=False
            ),

            RawNews(
                title="或命名“ORA 5”！欧拉汽车发起首款纯电SUV命名投票！",
                content="""[汽车之家 资讯] 日前，长城汽车欧拉品牌总经理发文称，欧拉从创立初期开始，就始终是一个与用户共创的品牌。所以现针对前不久工信部亮相的新车命名发起公开征集，车型投票名称包括欧拉猫(参数|询价)、ORA 5、ORA i5三种选项。
截至发文，共有790人参与欧拉全新SUV车型命名投票，其中票数最高的是“ORA 5”，有399人选择；人气最低的是“欧拉猫”，票数为149。
简单回顾新车，前不久吕文斌发布了其预告图，能看出整体风格延续了“猫”家族的设计理念，并且车身尺寸相比欧拉好猫更大，同时将会搭载激光雷达等硬件设备提升驾驶辅助能力。
欧拉首款纯电SUV预告图""",
                source="汽车之家",
                url="https://www.autohome.com.cn/news/202509/1309017.html",
                publish_date=datetime.utcnow() - timedelta(days=3),
                processed=False
            ),
            RawNews(
                title="特斯拉model Y 4D1电驱400V逆变器技术解读",
                content="""特斯拉的“4D1”是目前广泛应用于 Model Y(图片|配置|询价) 后驱版（RWD）的主力电驱动平台，搭载了一套后置永磁同步电机（PMSM）+ SiC逆变器的组合，具有高效率、轻量化、低成本等特点。
    特斯拉 Model Y 所搭载的 4D1 逆变器代表了中端纯电驱动平台的高性价比方案：
    相比传统IGBT逆变器，4D1方案在效率、功率密度、系统集成度上均具有领先优势，是特斯拉持续降本增效的关键之一。
""",
                source="汽车新闻",
                url="https://www.dongchedi.com/article/7551676289887879720",
                publish_date=datetime.utcnow() - timedelta(hours=2),
                processed=False
            ),
            RawNews(
                title="鸿蒙智行首款旅行车享界S9T上市，搭载华为电驱",
                content=""" 9月16日，鸿蒙智行旗下首款旅行车享界S9T(图片|配置|询价)正式上市。该车全系搭载华为DriveONE电驱动系统，提供纯电及增程两种动力版本，主打动力性能与能耗表现的平衡。
    享界S9T纯电版采用华为高压碳化硅动力平台，四驱版本前桥搭载158kW交流异步电机，后桥为227kW永磁同步电机。据官方数据，其Ultra版零百加速为3.95秒，CLTC续航里程达701公里。增程版则配备华为六合一电机，最高转速22000rpm，Ultra版CLTC综合续航为1305公里。
    该车搭载华为动态自适应扭矩控制系统，可实现毫秒级扭矩调节，旨在提升湿滑路面行驶稳定性和颠簸路况的滤震表现。全系支持6kW外放电功能，可输出220V交流电。
    华为DriveONE目前已与多个汽车品牌合作，为超过50款车型提供电驱解决方案。根据盖世汽车数据，2025年上半年其电驱动产品装机量位列行业第二，独立供应商中排名第一""",
                source="菲菲定制",
                url="https://www.dongchedi.com/article/7551411135245795882",
                publish_date=datetime.utcnow() - timedelta(days=3),
                processed=False
            )
        ]

        db.session.add_all(raw_news_list)
        db.session.commit()

        print("=== 测试数据填充完成 ===")
        print(f"添加了 {len(raw_news_list)} 条原始新闻")
        print("所有新闻都未处理，等待系统处理...")
        print()

        # 显示添加的原始新闻信息
        print("=== 原始新闻列表 ===")
        for i, news in enumerate(raw_news_list, 1):
            print(f"  {i}. 标题: {news.title}")
            print(f"     状态: {'已处理' if news.processed else '未处理'}")
            print(f"     ID: {news.id}")
            print(f"     发布时间: {news.publish_date}")
            print()

        # 手动处理新闻（模拟Celery worker处理过程）
        print("=== 开始处理新闻 ===")
        processed_count = 0
        failed_count = 0

        for news in RawNews.query.filter_by(processed=False).all():
            print(f"正在处理新闻: {news.title}")
            try:
                # 直接调用处理函数（而不是通过Celery）
                process_news_task(news.id)
                print(f"  ✓ 处理完成: {news.title}")
                processed_count += 1
            except Exception as e:
                print(f"  ✗ 处理失败: {news.title} - 错误: {str(e)}")
                failed_count += 1

        print(f"\n=== 处理结果统计 ===")
        print(f"成功处理: {processed_count} 条")
        print(f"处理失败: {failed_count} 条")
        print()

        # 显示处理后的统计数据
        print("=== 处理后统计 ===")
        total_raw = RawNews.query.count()
        processed_raw = RawNews.query.filter_by(processed=True).count()
        unprocessed_raw = RawNews.query.filter_by(processed=False).count()
        total_processed = ProcessedNews.query.count()

        print(f"原始新闻总数: {total_raw}")
        print(f"已处理原始新闻: {processed_raw}")
        print(f"未处理原始新闻: {unprocessed_raw}")
        print(f"处理后新闻总数: {total_processed}")
        print()

        # 显示处理后的新闻详情
        if total_processed > 0:
            print("=== 处理后的新闻详情 ===")
            processed_news_list = ProcessedNews.query.all()
            for i, news in enumerate(processed_news_list, 1):
                print(f"  {i}. 标题: {news.title}")
                print(f"     时间: {news.publish_date}")

                # 处理摘要乱码问题
                event_description = news.event_description
                if event_description:
                    # 确保正确解码
                    if isinstance(event_description, bytes):
                        try:
                            event_description = event_description.decode('utf-8')
                        except UnicodeDecodeError:
                            try:
                                event_description = event_description.decode('gbk')
                            except UnicodeDecodeError:
                                event_description = str(event_description)

                print(f"     摘要: {event_description}")
                print(f"     评分: {news.news_score}")

                # 处理品牌信息
                involved_brands = news.involved_brands if news.involved_brands else []
                print(f"     品牌: {involved_brands}")

                print(f"     分类: {news.category}")
                print(f"     看板摘要: {news.board_summary}")

                # 处理实体信息
                involved_entities = news.involved_entities if news.involved_entities else []
                print(f"     实体: {involved_entities}")
                print("  " + "-" * 50)
        else:
            print("没有成功处理的新闻")

        # 测试数据库查询功能
        print("\n=== 数据库查询测试 ===")

        # 测试按评分排序
        top_news = ProcessedNews.query.order_by(ProcessedNews.news_score.desc()).limit(3).all()
        print(f"评分最高的 {len(top_news)} 条新闻:")
        for news in top_news:
            print(f"  - {news.title} (评分: {news.news_score})")

        # 测试按分类统计
        category_stats = db.session.query(
            ProcessedNews.category,
            db.func.count(ProcessedNews.id)
        ).group_by(ProcessedNews.category).all()

        print("\n按分类统计:")
        for category, count in category_stats:
            print(f"  - {category}: {count} 条")

        # 测试按品牌统计
        print("\n按品牌统计:")
        all_brands = []
        for news in ProcessedNews.query.all():
            if news.involved_brands:
                all_brands.extend(news.involved_brands)

        brand_count = {}
        for brand in all_brands:
            brand_count[brand] = brand_count.get(brand, 0) + 1

        for brand, count in brand_count.items():
            print(f"  - {brand}: {count} 条新闻")

if __name__ == '__main__':
    populate_and_test_processing()
